home *** CD-ROM | disk | FTP | other *** search
/ The Atari Compendium / The Atari Compendium (Toad Computers) (1994).iso / files / prgtools / gnustuff / tos / smallt~1 / smallt~1.zoo / Object.st < prev    next >
Encoding:
Text File  |  1990-05-26  |  7.1 KB  |  321 lines

  1. "======================================================================
  2. |
  3. |   Object Method Definitions
  4. |
  5.  ======================================================================"
  6.  
  7.  
  8. "======================================================================
  9. |
  10. | Copyright (C) 1988, 1989, 1990 Free Software Foundation, Inc.
  11. | Written by Steve Byrne.
  12. |
  13. | This file is part of GNU Smalltalk.
  14. |
  15. | GNU Smalltalk is free software; you can redistribute it and/or modify it
  16. | under the terms of the GNU General Public License as published by the Free
  17. | Software Foundation; either version 1, or (at your option) any later version.
  18. | GNU Smalltalk is distributed in the hope that it will be useful, but WITHOUT
  19. | ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
  20. | FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
  21. | details.
  22. | You should have received a copy of the GNU General Public License along with
  23. | GNU Smalltalk; see the file COPYING.  If not, write to the Free Software
  24. | Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  
  25. |
  26.  ======================================================================"
  27.  
  28.  
  29. "
  30. |     Change Log
  31. | ============================================================================
  32. | Author       Date       Change 
  33. | sbyrne     26 Apr 90      Fixed shallowCopy to send new messages to the
  34. |                         object's class instead of the object itself.
  35. |
  36. | sbyrne     19 Sep 89      Converted to use real method categories.
  37. |
  38. | sbyrne      4 Jul 89      Added support for dependence relationships.
  39. |                         (-: how appropriate: July 4 is when the US declared
  40. |                             its INdependence from England :-)
  41. |
  42. | sbyrne     25 Apr 89      created.
  43. |
  44. "
  45.  
  46. Object comment: 
  47. 'I am the root of the Smalltalk class system. 
  48. All classes in the system are subclasses of me.' !
  49.  
  50.  
  51. !Object methodsFor: 'Relational operators'!
  52.  
  53. ~= anObject
  54.     ^(self = anObject) == false
  55. !
  56.  
  57. ~~ anObject
  58.     ^(self == anObject) == false 
  59. !
  60.  
  61. isNil
  62.     ^false
  63. !
  64.  
  65. notNil
  66.     ^true
  67. !!
  68.  
  69.  
  70.  
  71. !Object methodsFor: 'testing functionality'!
  72.  
  73. isKindOf: aClass
  74.     ^(self isMemberOf: aClass) or:
  75.         [ self class inheritsFrom: aClass ]
  76. !
  77.  
  78. isMemberOf: aClass
  79.     "Returns true if the receiver is an instance of the class 'aClass'"
  80.     ^self class == aClass
  81. !!
  82.  
  83.  
  84.  
  85. !Object methodsFor: 'copying'!
  86.  
  87. copy
  88.     ^self shallowCopy
  89. !
  90.  
  91. shallowCopy
  92.     | class aCopy |
  93.     class _ self class.
  94.     class isVariable
  95.         ifTrue: [ aCopy _ class basicNew: self basicSize ]
  96.     ifFalse: [ aCopy _ class basicNew ].
  97.  
  98.     " copy the instance variables (if any) "
  99.     1 to: class instSize do:
  100.         [ :i | aCopy instVarAt: i
  101.                  put: (self instVarAt: i) ].
  102.  
  103.     " copy the indexed variables (if any) "
  104.     class isVariable
  105.         ifTrue: [ 1 to: self basicSize do:
  106.                 [ :i | aCopy basicAt: i
  107.                          put: (self basicAt: i) ] ].
  108.     ^aCopy
  109. !
  110.  
  111. deepCopy
  112.     | class aCopy |
  113.     class _ self class.
  114.     class isVariable
  115.         ifTrue: [ aCopy _ class basicNew: self basicSize ]
  116.     ifFalse: [ aCopy _ class basicNew ].
  117.  
  118.     " copy the instance variables (if any) "
  119.     1 to: class instSize do:
  120.         [ :i | aCopy instVarAt: i
  121.                  put: (self instVarAt: i) deepCopy ].
  122.  
  123.     " copy the indexed variables (if any) "
  124.     class isVariable
  125.         ifTrue: [ 1 to: self basicSize do:
  126.                 [ :i | aCopy basicAt: i
  127.                          put: (self basicAt: i) deepCopy ] ].
  128.     ^aCopy
  129. !!
  130.  
  131.  
  132.  
  133. !Object methodsFor: 'class type methods'!
  134.  
  135. species
  136.     ^self class
  137. !
  138.  
  139. yourself
  140.     ^self
  141. !!
  142.  
  143.  
  144.  
  145. !Object methodsFor: 'dependents access'!
  146.  
  147. addDependent: anObject
  148.     | dependencies |
  149.     dependencies _ Smalltalk dependenciesAt: self.
  150.     dependencies isNil ifTrue:
  151.         [ dependencies _ Set new.
  152.       (Smalltalk at: #Dependencies) at: self put: dependencies ]
  153.     dependencies add: anObject
  154. !
  155.  
  156. removeDependent: anObject
  157.     | dependencies |
  158.     dependencies _ Smalltalk dependenciesAt: self.
  159.     dependencies notNil ifTrue:
  160.         [ dependencies remove: anObject ifAbsent: [] ]
  161. !
  162.  
  163. dependents
  164.     | dependencies |
  165.     dependencies _ Smalltalk dependenciesAt: self.
  166.     dependencies isNil ifTrue: [ dependencies _ Set new ].
  167.     ^dependencies asOrderedCollection
  168. !
  169.  
  170. release
  171.     " +++ I'm not sure that this is the right thing to do here; the book is
  172.       so vague... "
  173.     (Smalltalk at: #Dependencies) removeKey: self
  174. !!
  175.  
  176.  
  177.  
  178. !Object methodsFor: 'change and update'!
  179.  
  180. changed
  181.     self changed: self
  182. !
  183.  
  184. changed: aParameter
  185.     | dependencies |
  186.     dependencies _ Smalltalk dependenciesAt: self.
  187.     dependencies notNil ifTrue:
  188.         [ dependencies do:
  189.         [ :dependent | dependent update: aParameter ] ]
  190. !
  191.  
  192. update: aParameter
  193.     "Default behavior is to do nothing"
  194. !
  195.  
  196. broadcast: aSymbol
  197.     | dependencies |
  198.     dependencies _ Smalltalk dependenciesAt: self.
  199.     dependencies notNil ifTrue:
  200.         [ dependencies do:
  201.         [ :dependent | dependent perform: aSymbol ] ]
  202. !
  203.  
  204. broadcast: aSymbol with: anObject
  205.     | dependencies |
  206.     dependencies _ Smalltalk dependenciesAt: self.
  207.     dependencies notNil ifTrue:
  208.         [ dependencies do:
  209.         [ :dependent | dependent perform: aSymbol with: anObject ] ]
  210. !!
  211.  
  212.  
  213.  
  214. !Object methodsFor: 'printing'!
  215.  
  216. printString
  217.     | stream |
  218.     stream _ WriteStream on: (String new: 0).
  219.     self printOn: stream.
  220.     ^stream contents
  221. !
  222.  
  223. printOn: aStream
  224.     | article nameString |
  225.     nameString _ self classNameString.
  226.     article _ nameString first isVowel ifTrue: [ 'an ' ] ifFalse: [ 'a ' ].
  227.     article printOn: aStream.
  228.     nameString printOn: aStream
  229. !
  230.  
  231. print
  232.     self printOn: stdout
  233. !
  234.  
  235. printNl
  236.     self print.
  237.     Character nl print
  238. !!
  239.  
  240.  
  241.  
  242. !Object methodsFor: 'storing'!
  243.  
  244. storeString
  245.     | stream |
  246.     stream _ WriteStream on: (String new: 0).
  247.     self storeOn: stream.
  248.     ^stream contents
  249. !
  250.  
  251. storeOn: aStream
  252.     | class hasSemi |
  253.     class _ self class.
  254.     aStream nextPut: $(.
  255.     aStream nextPutAll: self classNameString.
  256.     hasSemi _ false.
  257.     class isVariable
  258.         ifTrue: [ aStream nextPutAll: ' basicNew: '.
  259.               self basicSize printOn: aStream ]
  260.         ifFalse: [ aStream nextPutAll: ' basicNew' ].
  261.     1 to: class instSize do:
  262.         [ :i | aStream nextPutAll: ' instVarAt: '.
  263.            i printOn: aStream.
  264.            aStream nextPutAll: ' put: '.
  265.            (self instVarAt: i) storeOn: aStream.
  266.            aStream nextPut: $;.
  267.            hasSemi _ true ].
  268.     class isVariable ifTrue: 
  269.         [ 1 to: self basicSize do:
  270.         [ :i | aStream nextPutAll: ' basicAt: '.
  271.                i printOn: aStream.
  272.            aStream nextPutAll: ' put: '.
  273.            (self basicAt: i) storeOn: aStream.
  274.            aStream nextPut: $;.
  275.            hasSemi _ true ] ].
  276.     hasSemi ifTrue: [ aStream nextPutAll: ' yourself' ].
  277.     aStream nextPut: $)
  278. !
  279.  
  280. store
  281.     self storeOn: stdout
  282. !
  283.  
  284. storeNl
  285.     self store.
  286.     Character nl print
  287. !!
  288.  
  289.  
  290.  
  291. !Object methodsFor: 'debugging'!
  292.  
  293. inspect
  294.     | class instVars instVal |
  295.     class _ self class.
  296.     instVars _ class instVarNames.
  297.     'An instance of ' print.
  298.     class printNl.
  299.     1 to: instVars size do:
  300.         [ :i | '  ' print.
  301.            (instVars at: i) print.
  302.            ': ' print.
  303.            (self instVarAt: i)  printNl ]
  304. !!
  305.  
  306.  
  307.  
  308. !Object methodsFor: 'private'!
  309.  
  310. classNameString
  311.     | name |
  312.     name _ self class name.
  313.     name isNil
  314.         ifTrue: [ name _ self name , ' class' ].
  315.     ^name
  316.  
  317. !!
  318.  
  319.